package com.wx.register;


import lombok.extern.slf4j.Slf4j;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 使用redis作为注册中心
 */
@Slf4j
public class RedisRegisterCenter {

    private static Jedis jedis;

    /**
     * 初始化连接池
     * @param host
     * @param port
     * @return
     */
    public static synchronized Boolean initClient(String host,Integer port){
        log.info("开始redis客户端初始化");
        try {
            //redis连接池的配置
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            //连接池最大连接数
            jedisPoolConfig.setMaxTotal(10);
            //最大空闲数
            jedisPoolConfig.setMaxIdle(5);
            //当连接池资源耗尽以后的最大等待时间,单位毫秒
            jedisPoolConfig.setMaxWaitMillis(3000);
            //当资源耗尽以后是否要进行等待
            jedisPoolConfig.setBlockWhenExhausted(true);
            //获得连接的时候是否进行连接的有效性监测，如果无效的连接会被移除
            jedisPoolConfig.setTestOnBorrow(true);
            //归还连接的时候是否进行有效性连接，如果是无效的连接会被移除
            jedisPoolConfig.setTestOnReturn(true);
            //是否开启JMX监控
            jedisPoolConfig.setJmxEnabled(true);
            JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port);
            Jedis resource = jedisPool.getResource();
            jedis=resource;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        log.info("redis客户端初始化完毕");
        return true;
    }
    /**
     * 注册生产者
     */
    public static Long registProvider(String providerInterface,String alias,String info){
        //向redis中注入生产者的信息key是接口名加上别名 value是这个接口的相关信息
        //如果这个key不存在就创建，存在以后如果接口中有这个value就直接返回0，如果没有就添加
        Long sadd = jedis.sadd(providerInterface + "=" + alias, info);
        log.info("生产者注册信息到redis里面：{}；{}：{}",providerInterface,alias,info);
        return sadd;
    }
    /**
     * 获得生产者的相关信息
     *
     */
    public static String getProviderInfo(String providerInterface,String alias ){
        /**
         *  如果 count 为正数，且小于集合基数，那么命令返回一个包含 count 个元素的数组，数组中的元素各不相同。如果 count 大于等于集合基数，那么返回整个集合。
         * 如果 count 为负数，那么命令返回一个数组，数组中的元素可能会重复出现多次，而数组的长度为 count 的绝对值
         */
        String srandmember = jedis.srandmember(providerInterface + "=" + alias);
        log.info("消费者获得生产则{}信息为：{}",providerInterface+"="+alias,srandmember);
        return srandmember;
    }

    public static Jedis getJedis(){
        return jedis;
    }
}
